release: dev → prod (2026-09-06, second cut: notification copy + roster doc) - #1525
Conversation
…live DB (#1521) ## Summary A 2026-09-06 E2E run found that the "By org archetype" credential roster in `docs/enterprise/90-audits/03-verification-guide.md` had drifted from the live seed data. Specifically, the doc listed `rachel.anderson@hotmail.com` as an IIT Madras LEARNER, but that user has no live membership at IIT Madras at all — the actual IIT Madras LEARNER cohort is the Brown family (`sophia`, `thomas`, `victoria`, `william`). While regenerating the roster from Supabase project `pzmbxqdgibfkhjwzeprf`, three more stale rows turned up in the same table: - **Wipro LEARNERs**: doc said `olivia.anderson@gmail.com`, `patrick.anderson@outlook.com`, `priya.anderson@yahoo.com` (none have live Wipro memberships); live LEARNERs are `robert.brown@gmail.com`, `samantha.brown@outlook.com`, `sarah.brown@yahoo.com`. - **Wipro OWNER**: doc said `samantha.anderson@yahoo.com`; the live persistent OWNER (besides `tour-owner@familiarise.dev`, which is correct) is `zara.brown@yahoo.com`. - **Platform admin**: doc said `olivia.brown@protonmail.com`, but that user's live `role` is `CONSULTANT`, not `ADMIN` — the login would not reach the admin surface. A live `ADMIN`-role user is `robert.davis@yahoo.com`. - **Arjun Anderson's Coaching slug**: doc said `arjun-anderson-coaching-mrpk`; the live slug is `arjun-anderson-coaching-2ncb`. The Wipro OWNER (tour), IIT Madras OWNER/EXPERT rows, LearnPro OWNER/EXPERT rows, and the multi-org-consultant note all checked out against the live data and were left unchanged. **Scope note:** per the task, only the credential/roster table and its accompanying note were rewritten. The step-by-step Flow B (`olivia.anderson@gmail.com` as the Wipro learner), Flow C (`rachel.anderson@hotmail.com` as the IIT learner to assign), and Flow G (`olivia.brown@protonmail.com` as the ADMIN login) narrative sections still reference the pre-drift logins and were intentionally left untouched to avoid widening this PR's scope — those should be corrected in a follow-up pass so the walkthroughs point at working logins. The "Seeded data summary" counts line (`4 orgs · 78 users · 22 enterprise memberships · ...`) also was not reverified beyond the active-membership count for the 4 archetype orgs (26, not 22) and total live `users` (250, not 78) — those higher-level counts likely reflect years of accumulated dev/prod activity on the single shared Supabase project rather than a clean reseed, and reconciling them was out of scope here. ## Regeneration SQL ```sql -- Active enterprise memberships for the four seed orgs, joined to email/name/role. SELECT o.name AS org_name, m.role, u.email, u.name, m.status FROM "Membership" m JOIN users u ON u.id = m."userId" JOIN organizations o ON o.id = m."organizationId" WHERE o.slug IN ('wipro', 'learnpro-academy', 'iit-madras', 'arjun-anderson-coaching-2ncb') ORDER BY o.name, m.role, u.email; -- Live ADMIN-role users (the "Platform admin" persona). SELECT email, name, role FROM users WHERE role = 'ADMIN'; ``` ## Verification - `npx prettier --check docs/enterprise/90-audits/03-verification-guide.md` fails, but this is pre-existing formatting debt unrelated to this change — the same command fails identically against the pre-edit `dev` version of this file (verified via `git stash`). Running `prettier --write` on the whole file would reformat ~150 unrelated lines (table alignment, `*emphasis*` → `_emphasis_`, etc.), which the task explicitly asked me not to do, so the diff here is scoped to only the touched roster lines. - Read-only `SELECT`s only were run against Supabase; no writes were made. ## Undone - Flow B / Flow C / Flow G narrative logins are not yet updated to match the corrected roster (see Scope note above). - The "Seeded data summary" counts line was not reconciled against live totals. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01EyngsXG829TRTBof4CSGT1
…— recipient-zone dates, currency amounts, plan titles, labelled types, and a reschedule sentence that never reads "from to" (#536, #1085) (#1524) Every Novu payload now carries customer-ready values: dates rendered in the recipient's own time zone (IST-labelled by default), money as currency instead of paise, plan titles instead of ids, sentence-case labels beside the raw enums, a reschedule notice that never reads "from to", a named canceller ("The platform" for system) with a reason that is never blank, and "until further notice" for indefinite suspensions. Raw machine values stay under unit-suffixed keys. Two CodeRabbit rounds triaged (6 threads: 5 fixed, 1 out of scope); Sonar gate OK. Closes #536 Part of #1085 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01EyngsXG829TRTBof4CSGT1
✅ Deploy Preview for familiarise ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Essentials Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
|




Release: dev → prod (2026-09-06, second cut)
Follow-up to #1523 (prod
b3082643b). This release carries the two PRs merged intodevsince:CONSULTATIONbecome "consultation", the reschedule notice never reads "from to", "who cancelled" is a name (or "The platform"), and the reason is always present. Raw machine values stay beside the readable ones under unit-suffixed keys. Closes #536, part of #1085.Verification
devfor both PRs; SonarCloud gate OK on fix(notifications): every Novu payload carries customer-ready values — recipient-zone dates, currency amounts, plan titles, labelled types, and a reschedule sentence that never reads "from to" (#536, #1085) #1524 (0.0% duplication); CodeRabbit round 1 triaged (4 threads fixed and resolved).__tests__/security/novu-payload-allowlist.test.ts(20 cases) covers zone rendering, money, plan titles, cancellation copy, zero amounts and rejected instants.db pushneeded.After merge
git pullondev; wait for the Netlify production deploy; trigger one notification-bearing action on familiarisenow.com and read the inbox copy.🤖 Generated with Claude Code
https://claude.ai/code/session_01EyngsXG829TRTBof4CSGT1